package com.skyline.attraction.dao;

import java.util.Date;
import java.util.List;

import com.skyline.attraction.model.AttractionInvitation;
import com.skyline.base.type.Activity;
import com.skyline.user.model.Fan;

/**
 * 邀请好友到某地
 * 
 * @author Colonel
 * 
 */
public interface AttractionInviteDao {

	/************************************ save ***********************************/

	/**
	 * 保存
	 * 
	 * @param owerId
	 * @param fanId
	 * @param fanNickname
	 * @param fanPortait
	 * @param spotId
	 * @param spotName
	 * @param content
	 * @param invitingTime
	 * @param activity
	 */
	public long insertInvitation(long owerId, long fanId, String fanNickname,
			String fanPortait, long spotId, String spotName, String content,
			Date invitingTime, Date appointmentTime);

	/*********************************** query ********************************/

	/**
	 * @param id
	 * @return
	 */
	public AttractionInvitation queryInvitationById(long id);

	/**
	 * 得到该ower发出的所有邀请 包括现在的 过去的
	 * 
	 * 按timestamp 进行分类 （对某一用户而言，一个timestamp代表一个邀请事件）
	 * 
	 * @param owerId
	 * @param activity
	 *            null 为所有
	 * @return
	 */
	public List<AttractionInvitation> queryInvitationByOwerId(long owerId,
			Activity activity);

	/**
	 * 得到某个用户的某个邀请事件
	 * 
	 * 按timestamp 进行分类 返回>=timestamp的所有邀请事件 （对某一用户而言，一个timestamp代表一个邀请事件）
	 * 
	 * @param owerId
	 * @param timestamp
	 * @param activity
	 *            null 为所有
	 * @return
	 */
	public List<AttractionInvitation> queryInvitationByOwerId(long owerId,
			Date timestamp, Activity activity);

	/**
	 * 返回用户的某个邀请事件的所有粉丝
	 * 
	 * @param activity
	 *            null 为所有
	 */
	public List<Fan> queryFansByOwerIdTimestamp(long owerId,
			Date timestamp, Activity activity);

	/**
	 * 返回 跟某粉丝有关的 所有 邀请事件
	 * 
	 * @param activity
	 *            null为所有
	 */
	public List<AttractionInvitation> queryInvitationsOfFanByFanId(long fanId,
			Activity activity);

	public List<AttractionInvitation> queryInvitationsOfFanByFanNickname(String nickname,
			Activity activity);

	/**
	 * 返回 跟某一spot有关的邀请事件
	 * 
	 * @param activity
	 *            null 为所有
	 */
	public List<AttractionInvitation> queryInvitationsBySpotId(long spotId,
			Activity activity);

	public List<AttractionInvitation> queryInvitationsBySpotName(String spotName,
			Activity activity);

	/**
	 * 根据预约时间返回所有的 邀请事件
	 * 
	 * @param activity
	 *            null 为所有
	 */
	public List<AttractionInvitation> queryInvitationsByAppointmentTime(
			Date appointmentTime, Activity activity);

	/***************************** delete ****************************/

	/**
	 * 根据id删除
	 * 
	 * @param id
	 */
	public void deleteInvitationById(long id);

	/**
	 * 根据owerId删除 <font color='red'>注意这会全部删除该ower发出的所有邀请</font>
	 * 
	 * @param owerId
	 */
	public void deleteInvitationByOwerId(long owerId);

	/**
	 * 删除某个邀请事件中 某用户所发出的所有邀请
	 * 
	 * @param owerId
	 * @param timestamp
	 */
	public void deleteInvitationByTimestamp(long owerId, Date timestamp);

	/**
	 * 通过spotId
	 */

	public void deleteInvitationBySpotId(long spotId);

	/**
	 * 删除所有用户的邀请 清空数据库
	 * 
	 * */
	public void deleteAll();

	/**
	 * @param owerId 
	 * 若为-1，则删除该粉丝有关的 所有邀请;
	 * 若>0,则删除该ower发出的 跟该粉丝有关的 所有邀请
	 * @param fanId
	 * @param timestamp 
	 * null为所有
	 */
	public void deleteInvitationByFanId(long owerId,long fanId,Date timestamp);

	/******************************* update *************************/

	public void updateInvitation(long owerId,long fanId);

	/**
	 * 更新某用户的 某个邀请事件
	 * 
	 * @param owerId
	 *            not null
	 * @param spotId
	 * @param spotName
	 * @param timestamp
	 *            not null
	 * @param appointmentTime
	 */
	public void updateInvitationByOwerIdAndTimestamp(Long owerId, long spotId,
			String spotName, Date timestamp, Date appointmentTime);

}
